<?php

/**
 * mysql.php 数据库连接
 * 
 * @author 老洪
 * @link www.baidu.com
 * @since 2020年11月18日 14:24:05
 * @copyright CGX
 */

/**
 * 连接数据库
 * 
 * @return resource 成功则返回一个资源
 */
function mConn()
{
  //静态变量使得mConn在同一个页面 数据库只连接一次
  static $conn = null;
  if ($conn === null) {
    //$cfg = require('./config.php');
    $cfg = require ROOT . '/lib/config.php';
    $conn = mysqli_connect($cfg['host'], $cfg['user'], $cfg['password'], $cfg['db']);
    mysqli_query($conn, 'set names ' . $cfg['charset']);
  }
  return $conn;
}

/**
 * 执行SQL语句
 * @param $sql 
 * @return 成功则返回布尔型和返回值
 */
function mQuery($sql)
{
  $conn = mConn();
  $res = mysqli_query($conn, $sql);
  if ($res === false) {
    mLog($sql . "\n" . mysqli_error($conn));
    return $res;
  }
  mLog($sql);
  return $res;
}

/**
 * 写日志文件
 * @param $log 错误日志
 * @return 成功则返回布尔型和返回值
 */
function mLog($log)
{
  $path = ROOT . '/log/' . date('Ymd', time()) . '.txt';
  $head = '------------------------------------------------------' . "\n" . date('Y/m/d H:i:s', time()) . "\n";
  //file_put_contents文件如果不存在，则创建一个文件名，FILE_APPEND追加数据到文件末尾
  file_put_contents($path, $head . $log . "\n" . "\n", FILE_APPEND);
}

/**
 * 查询select语句并返回多行，适用于查询多条数据
 * @param string $sql select语句 
 * @return mixd array 查询到返回二维数组，未查到返回false
 */
function mGetAll($sql)
{
  $res = mQuery($sql);
  if (!$res) {
    return false;
  } else {
    $arr = array();
    while ($row = mysqli_fetch_assoc($res)) {
      $arr[] = $row;
    }
  }
  return $arr;
}

/**
 * 查询select语句并返回一行数据
 * @param string $sql select语句 
 * @return mixd array 查询到返回数组，未查到返回false
 */
function mGetRow($sql)
{
  $res = mQuery($sql);

  // if (!$res) {
  //   return false;
  // } else {
  //   $arr = mysqli_fetch_assoc($res);
  // }
  // return $arr;
  return $res ? mysqli_fetch_assoc($res) : false;
}
/**
 * 查询select语句并返回一个单元
 * 
 * @param string $sql select语句 
 * @return mixd String查询并返回一个标量，未查到返回false
 */
function mGetOne($sql)
{
  $res = mQuery($sql);
  if ($res) {
    $row = mysqli_fetch_assoc($res);
    return $row['num'];
  } else {
    return false;
  }
}

//拼接语句非常麻烦，所以我们直接封装一个函数
//让函数自动拼接SQL，并且发送SQL语句
/**
 * 查询select语句并返回一个单元
 * 
 * @param array $data 要插入或者修改的数据，键代表列名，值为新值
 * @param String $table 待插入或修改的表名
 * @param String $act 要执行插入或修改操作的标识，默认insert
 * @param String $where 防止update语句更改忘记加where条件，导致修改所有数据  
 * @return 返回成功或失败
 */
function mExec($table, $data, $act = 'insert', $where = '0')
{
  // $where='0'就是不执行语句
  if ($act == 'insert') {
    $sql = 'insert into ' . $table . '(';
    //implode(',',array_keys($data)) 以逗号间隔，把所有的键名使用array_keys循环出所有键
    $sql .= implode(',', array_keys($data)) . ") values('";
    $sql .= implode("','", array_values($data)) . "')";
    // return $sql;

    return mQuery($sql);
  } else if ($act = 'update') {
    //update cat set name='zhangsan',sex='男',where id = '0x1'
    $sql = 'update ' . $table . ' set ';
    foreach ($data as $k => $v) {
      $sql .= $k . "='" . $v . "',";
    }
    //去掉sql语句的set参数后最后一个逗号
    $sql = rtrim($sql, ',');
    $sql .= ' where ' . $where;
    // return $sql;
    return mQuery($sql);
  }
  //该方法使用test.php进行测试
}

//转换时间戳
function convert($str)
{
  $str = $str . date('Y-m-d H:i:s');
  return $str;
}
